package 单例模式;

/**
 * Created with IntelliJ IDEA.
 * Description:懒汉模式 线程不安全,getInstance修改(load cmp new assgin)操作不是原子的,t2在t1new之前还会new一个对象,因此线程不安全
 * 必须调用getSingleton方法才能创建实例对象:导致线程不安全
 * User: lenovo
 * Date: 2022-09-25
 * Time: 21:22
 */
class SingletonLazy{
    private volatile static SingletonLazy instance = null;//防止指令重排序
    public  SingletonLazy getSingleton(){
        //只想要第一次调用getInstance时才加锁,因此在判断是否要创建实例化对象之前还得先判读是否要加锁
        //即在第一次调用getInstance时,外面的if为true,会加锁并创建对象,第二次调用getInstance时,外面的if为false,因为已经不是第一次调用getInstance了,所以不用在加锁并创建实例对象了
        if(instance == null){//判断是否还要加锁
            synchronized (SingletonLazy.class){
                if(instance == null){//判断是否创建实例化对象
                    instance = new SingletonLazy();
                }
                return instance;
            }
        }
        return  instance;

    }

}
public class Demo2 {
    public static void main(String[] args) {
        SingletonLazy singletonLazy = new SingletonLazy();
        singletonLazy.getSingleton();
    }
}
